#ifndef GAMEENGINE_GEOMETRY_TYPE_DEFS_H
#define GAMEENGINE_GEOMETRY_TYPE_DEFS_H

#include <GameEngine/Geometry/geometry_settings.h>

#include <GameEngine/Geometry/Location/point2d.h>
#include <GameEngine/Geometry/Location/vector2d.h>
#include <GameEngine/Geometry/Lines/line2d.h>
#include <GameEngine/Geometry/Surfaces/circle2d.h>
#include <GameEngine/Geometry/Surfaces/parallelogram2d.h>

#include <GameEngine/Geometry/Location/point3d.h>
#include <GameEngine/Geometry/Location/vector3d.h>
#include <GameEngine/Geometry/Lines/line3d.h>
#include <GameEngine/Geometry/Surfaces/circle3d.h>
#include <GameEngine/Geometry/Surfaces/parallelogram3d.h>
#include <GameEngine/Geometry/Surfaces/plane3d.h>
#include <GameEngine/Geometry/Surfaces/trgl3d.h>
#include <GameEngine/Geometry/Surfaces/trgl3dfast.h>
#include <GameEngine/Geometry/Surfaces/polygon3d.h>
#include <GameEngine/Geometry/Volumes/sphere.h>


#ifdef GAMEENGINE_NAMESPACES
namespace GameEngine {
#endif

// 2D typedefs
//----------------------------

// Float precision

//! Two-dimensional point with floating point precision
typedef GameEngine::Point2d         <float> Point2df;
//! Two-dimensional vector with floating point precision
typedef GameEngine::Vector2d        <float> Vector2df;
//! Two-dimensional line with floating point precision
typedef GameEngine::Line2d          <float> Line2df;
//! Two-dimensional circle with floating point precision
typedef GameEngine::Circle2d        <float> Circle2df;
//! Two-dimensional parallelogram with floating point precision
typedef GameEngine::Parallelogram2d <float> Parallelogram2df;

// Double precision

//! Two-dimensional point with double floating point precision
typedef GameEngine::Point2d         <double> Point2dd;
//! Two-dimensional vector with double floating point precision
typedef GameEngine::Vector2d        <double> Vector2dd;
//! Two-dimensional line with double floating point precision
typedef GameEngine::Line2d          <double> Line2dd;
//! Two-dimensional circle with double floating point precision
typedef GameEngine::Circle2d        <double> Circle2dd;
//! Two-dimensional parallelogram with double floating point precision
typedef GameEngine::Parallelogram2d <double> Parallelogram2dd;

// 3D typedefs
//----------------------------

// Float precision

//! Three-dimensional point with floating point precision
typedef GameEngine::Point3d         <float> Point3df;
//! Three-dimensional vector with floating point precision
typedef GameEngine::Vector3d        <float> Vector3df;
//! Three-dimensional line with floating point precision
typedef GameEngine::Line3d          <float> Line3df;
//! Three-dimensional circle with floating point precision
typedef GameEngine::Circle3d        <float> Circle3df;
//! Three-dimensional parallelogram with floating point precision
typedef GameEngine::Parallelogram3d <float> Parallelogram3df;
//! Three-dimensional plane with floating point precision
typedef GameEngine::Plane3d         <float> Plane3df;
//! Three-dimensional triangle with floating point precision
typedef GameEngine::Trgl3d          <float> Trgl3df;
//! Three-dimensional fast triangle with floating point precision
typedef GameEngine::Trgl3dFast      <float> Trgl3dFastf;
//! Three-dimensional polygon with floating point precision
typedef GameEngine::Polygon3d       <float> Polygon3df;
//! Three-dimensional sphere with floating point precision
typedef GameEngine::Sphere          <float> Spheref;

// Double precision
//! Three-dimensional point with double floating point precision
typedef GameEngine::Point3d         <double> Point3dd;
//! Three-dimensional vector with double floating point precision
typedef GameEngine::Vector3d        <double> Vector3dd;
//! Three-dimensional line with double floating point precision
typedef GameEngine::Line3d          <double> Line3dd;
//! Three-dimensional circle with double floating point precision
typedef GameEngine::Circle3d        <double> Circle3dd;
//! Three-dimensional parallelogram with double floating point precision
typedef GameEngine::Parallelogram3d <double> Parallelogram3dd;
//! Three-dimensional plane with double floating point precision
typedef GameEngine::Plane3d         <double> Plane3dd;
//! Three-dimensional triangle with double floating point precision
typedef GameEngine::Trgl3d          <double> Trgl3dd;
//! Three-dimensional fast triangle with double floating point precision
typedef GameEngine::Trgl3dFast      <double> Trgl3dFastd;
//! Three-dimensional polygon with double floating point precision
typedef GameEngine::Polygon3d       <double> Polygon3dd;
//! Three-dimensional sphere with double floating point precision
typedef GameEngine::Sphere          <double> Sphered;

#ifdef GAMEENGINE_NAMESPACES
} // namespace GameEngine
#endif

#endif
